/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.services.impl;

import javax.xml.ws.WebServiceException;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Service;

import fr.generali.accueilclient.client.om.IClientConsultation;
import fr.generali.accueilclient.client.om.IClientParticulier;
import fr.generali.accueilclient.client.om.IClientProfessionnel;
import fr.generali.accueilclient.client.om.IPersonne;
import fr.generali.accueilclient.client.om.NaturePersonne;
import fr.generali.accueilclient.client.services.IConsultationClientService;
import fr.generali.accueilclient.commun.exception.AbstractAccueilClientAnalyseWSException;
import fr.generali.accueilclient.commun.exception.AccueilClientBusinessException;
import fr.generali.accueilclient.commun.exception.AccueilClientTechnicalException;
import fr.generali.refservcommuns.rce.consultdonneesmarketing.ConsulterDonneesMarketing;
import fr.generali.refservcommuns.rce.consultdonneesmarketing.ConsulterDonneesMarketingResponse;
import fr.generali.refservcommuns.rce.consultdonneesmarketing.services.IConsultDonneesMarketingWebService;
import fr.generali.refservcommuns.rce.consultindicateursclient.ConsulterIndicateursClient;
import fr.generali.refservcommuns.rce.consultindicateursclient.ConsulterIndicateursClientResponse;
import fr.generali.refservcommuns.rce.consultindicateursclient.services.IConsultationIndicateursClientWebService;
import fr.generali.refservcommuns.rce.consultpersonnecontact.ConsulterPersonneContact;
import fr.generali.refservcommuns.rce.consultpersonnecontact.ConsulterPersonneContactResponse;
import fr.generali.refservcommuns.rce.consultpersonnecontact.services.IConsultationPersonneContactWebService;
import fr.generali.refservcommuns.rce.demat.consultpersonneenvcomplet.ConsulterPersonneEnvComplet;
import fr.generali.refservcommuns.rce.demat.consultpersonneenvcomplet.ConsulterPersonneEnvCompletResponse;
import fr.generali.refservcommuns.rce.demat.consultpersonneenvcomplet.services.IConsultationPersonneDematEnvCompletWebService;
import fr.generali.refservcommuns.rce.consultpersonnesimple.ConsulterPersonneSimple;
import fr.generali.refservcommuns.rce.consultpersonnesimple.ConsulterPersonneSimpleResponse;
import fr.generali.refservcommuns.rce.consultpersonnesimple.services.IConsultationPersonneSimpleWebService;

/**
 * Implémentation de {@link IConsultationClientService}
 * 
 * @author selrhazala
 */
@Service
public class ConsultationClientService extends AbstractAccueilClientAnalyseWSException implements
                IConsultationClientService {

    /**
     * LOGGER
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(ClientService.class);

    /**
     * Service de consultation des données marketings
     */
    @Autowired
    @Qualifier("P11")
    private IConsultDonneesMarketingWebService p11;

    /**
     * Service de consultation des indicateurs du client
     */
    @Autowired
    @Qualifier("P19")
    private IConsultationIndicateursClientWebService p19;

    /**
     * Service de lecture personne "light" RCE.
     */
    @Autowired
    @Qualifier("P41")
    private IConsultationPersonneSimpleWebService p41;

    /**
     * Service de lecture personne RCE incluant les données de contact.
     */
    @Autowired
    @Qualifier("P42")
    private IConsultationPersonneContactWebService p42;

    /**
     * Service de lecture personne RCE incluant l'environnement complet.
     */
    @Autowired
    @Qualifier("P44")
    private IConsultationPersonneDematEnvCompletWebService p44;

    /**
     * Assembler en entrée de P41
     */
    @Autowired
    @Qualifier("clientConsultation2ConsulterPersonneSimpleConverter")
    private Converter<IClientConsultation, ConsulterPersonneSimple> clientConsultation2ConsulterPersonneSimpleConverter;

    /**
     * Assembler en entrée de P42
     */
    @Autowired
    @Qualifier("clientConsultation2ConsulterPersonneContactConverter")
    private Converter<IClientConsultation, ConsulterPersonneContact> clientConsultation2ConsulterPersonneContactConverter;

    /**
     * Assembler en entrée de P44
     */
    @Autowired
    @Qualifier("clientConsultation2ConsulterPersonneEnvCompletConverter")
    private Converter<IClientConsultation, ConsulterPersonneEnvComplet> clientConsultation2ConsulterPersonneEnvCompletConverter;

    /**
     * Assembler en entrée de P11
     */
    @Autowired
    @Qualifier("clientConsultation2ConsulterDonneesMarketingConverter")
    private Converter<IClientConsultation, ConsulterDonneesMarketing> clientConsultation2ConsulterDonneesMarketingConverter;

    /**
     * Assembler en entrée de P19
     */
    @Autowired
    @Qualifier("clientConsultation2ConsulterIndicateursClientConverter")
    private Converter<IClientConsultation, ConsulterIndicateursClient> clientConsultation2ConsulterIndicateursClientConverter;

    /**
     * Assembler en entrée de P19
     */
    @Autowired
    @Qualifier("clientProfessionnel2ConsulterIndicateursClientConverter")
    private Converter<IClientProfessionnel, ConsulterIndicateursClient> clientProfessionnel2ConsulterIndicateursClientConverter;

    /**
     * Classe permettant de mapper les résultats des appels aux webservices
     */
    @Autowired
    private ClientServiceMapper clientServiceMapper;

    /**
     * {@inheritDoc}
     */
    public IPersonne lireClientContact(IClientConsultation criteres) throws AccueilClientBusinessException {
        IPersonne client = null;
        ConsulterPersonneContactResponse resp = null;

        try {
            ConsulterPersonneContact req = clientConsultation2ConsulterPersonneContactConverter.convert(criteres);
            resp = p42.consulterPersonneContact(req);
            client = clientServiceMapper.mapperLectureClientContact(resp);
        } catch (fr.generali.refservcommuns.rce.consultpersonnecontact.services.TechnicalFault e) {
            LOGGER.error(e.getMessage());
            throw new AccueilClientTechnicalException(e.getMessage(), StringUtils.EMPTY, e);

        } catch (fr.generali.refservcommuns.rce.consultpersonnecontact.services.WsRceBusinessException e) {
            LOGGER.debug(e.getMessage());
            throw new AccueilClientBusinessException(e.getMessage(), e);
        } catch (WebServiceException ew) {

            analyzeWsException(ew);
        }

        return client;
    }

    /**
     * {@inheritDoc}
     */
    public IPersonne lireClientSimple(IClientConsultation criteres) throws AccueilClientBusinessException {
        IPersonne client = null;
        ConsulterPersonneSimpleResponse response = null;

        try {
            ConsulterPersonneSimple request = clientConsultation2ConsulterPersonneSimpleConverter.convert(criteres);
            response = p41.consulterPersonneSimple(request);
            client = clientServiceMapper.mapperLectureClientSimple(response);
        } catch (fr.generali.refservcommuns.rce.consultpersonnesimple.services.TechnicalFault e) {
            LOGGER.error(e.getMessage());
            throw new AccueilClientTechnicalException(e.getMessage(), StringUtils.EMPTY, e);
        } catch (fr.generali.refservcommuns.rce.consultpersonnesimple.services.WsRceBusinessException e) {
            LOGGER.debug(e.getMessage());
            throw new AccueilClientBusinessException(e.getMessage(), e);
        } catch (WebServiceException ew) {

            analyzeWsException(ew);
        }

        return client;
    }

    /**
     * {@inheritDoc}
     */
    public IPersonne lireClientEnvironnementComplet(IClientConsultation criteres) throws AccueilClientBusinessException {
        IPersonne client = null;

        try {
            ConsulterPersonneEnvComplet request =
                            clientConsultation2ConsulterPersonneEnvCompletConverter.convert(criteres);
            ConsulterPersonneEnvCompletResponse response = p44.consulterPersonneEnvComplet(request);
            client = clientServiceMapper.mapperLectureClientEnvironnementComplet(response);

            if (client != null) {
                // Lecture du profil marketing
                // client = lireProfilMarketingClient(criteres, client);

                // Lecture des indicateurs
                client = lireIndicateursClient(criteres, client);

                if (NaturePersonne.PROFESSIONNEL.equals(client.getNaturePersonne())) {
                    client = lireIndicateursClientPro(IClientProfessionnel.class.cast(client));
                }
            }
        } catch (fr.generali.refservcommuns.rce.demat.consultpersonneenvcomplet.services.TechnicalFault e) {
            // Pas d'exception jetée ici car la recherche lance une exception
            // quand 0 client trouvé
            LOGGER.debug(e.getMessage());
        } catch (fr.generali.refservcommuns.rce.demat.consultpersonneenvcomplet.services.WsRceBusinessException e) {
            // Pas d'exception jetée ici car la recherche lance une exception
            // quand 0 client trouvé
            LOGGER.debug(e.getMessage());
        } catch (WebServiceException ew) {

            analyzeWsException(ew);
        }

        return client;
    }

    /**
     * {@inheritDoc}
     */
    public IClientParticulier lireProfilMarketingClient(IClientConsultation criteres,
                    IClientParticulier clientParticulier) throws AccueilClientBusinessException {
        try {
            ConsulterDonneesMarketing request = clientConsultation2ConsulterDonneesMarketingConverter.convert(criteres);
            ConsulterDonneesMarketingResponse response = p11.consulterDonneesMarketing(request);
            clientParticulier.setDonneeMarketing(clientServiceMapper.mapperProfilMarketingClient(response));
        } catch (fr.generali.refservcommuns.rce.consultdonneesmarketing.services.TechnicalFault e) {
            LOGGER.error(e.getMessage());
            throw new AccueilClientTechnicalException(e.getMessage(), StringUtils.EMPTY, e);
        } catch (fr.generali.refservcommuns.rce.consultdonneesmarketing.services.WsRceBusinessException e) {
            LOGGER.debug(e.getMessage());
            throw new AccueilClientBusinessException(e.getMessage(), e);
        } catch (WebServiceException ew) {

            analyzeWsException(ew);
        }

        return clientParticulier;
    }

    /**
     * {@inheritDoc}
     */
    public IPersonne lireIndicateursClient(IClientConsultation criteres, IPersonne client)
                    throws AccueilClientBusinessException {

        try {
            ConsulterIndicateursClient request =
                            clientConsultation2ConsulterIndicateursClientConverter.convert(criteres);
            ConsulterIndicateursClientResponse response = p19.consulterIndicateursClient(request);
            clientServiceMapper.mapperIndicateursClient(response, client);
        } catch (fr.generali.refservcommuns.rce.consultindicateursclient.services.TechnicalFault e) {
            LOGGER.debug(e.getMessage());
            throw new AccueilClientBusinessException(e.getMessage(), e);
        } catch (fr.generali.refservcommuns.rce.consultindicateursclient.services.WsRceBusinessException e) {
            LOGGER.debug(e.getMessage());
            throw new AccueilClientBusinessException(e.getMessage(), e);
        } catch (WebServiceException ew) {

            analyzeWsException(ew);
        }

        return client;
    }

    /**
     * {@inheritDoc}
     */
    public IPersonne lireIndicateursClientPro(IClientProfessionnel client) throws AccueilClientBusinessException {

        try {
            ConsulterIndicateursClient request =
                            clientProfessionnel2ConsulterIndicateursClientConverter.convert(client);
            ConsulterIndicateursClientResponse response = p19.consulterIndicateursClient(request);
            clientServiceMapper.mapperIndicateursClientPro(response, client);
        } catch (fr.generali.refservcommuns.rce.consultindicateursclient.services.TechnicalFault e) {
            LOGGER.debug(e.getMessage());
            throw new AccueilClientBusinessException(e.getMessage(), e);
        } catch (fr.generali.refservcommuns.rce.consultindicateursclient.services.WsRceBusinessException e) {
            LOGGER.debug(e.getMessage());
            throw new AccueilClientBusinessException(e.getMessage(), e);
        } catch (WebServiceException ew) {

            analyzeWsException(ew);
        }

        return client;
    }

}
